/*
 * @Author: '龙佳鑫' '1554845699@qq.com'
 * @Date: 2024-10-11 23:05:47
 * @LastEditors: '龙佳鑫' '1554845699@qq.com'
 * @LastEditTime: 2024-10-14 17:31:53
 * @FilePath: \trip_server\index.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
const express = require("express");
const app = express();
const joi = require("joi");
var expressJWT = require("express-jwt"); //解析token中间件
const bodyParser = require("body-parser");
app.use(bodyParser.json());
const secret = require("./common/util/secret.js"); //导入全局配置文件
const path = require('path');

// 设置静态文件目录
app.use('/uploads', express.static(path.join(__dirname, '../uploads')));
//响应数据中间件，一定要在路由前
app.use((req, res, next) => {
  // status 默认值为1，表示失败的情况
  // err 的值，可能是一个错误对象，也可能是一个错误的描述字符串
  res.cc = function (err, status = 1) {
    res.send({
      status,
      message: err instanceof Error ? err.message : err,
    });
  };
  next();
});
// 配置解析token的中间件
// 登录和注册不需要token验证
app.use(
  expressJWT({ secret: secret.jwtSecretKey }).unless({ path:[/^\/user\/login$/,/^\/user\/register$/] })
);
app.use((req, res, next) => {
  // 配置全局正确中间件
  res.zz = function (msg, data, status = 0) {
    res.send({
      status,
      message: msg instanceof Error ? msg.message : msg,
      data,
    });
  };
  next();
});

app.use(function (err, req, res, next) {
  if (err.name === "UnauthorizedError") {
    return res.send({
      status: 401,
      message: '无效的Token',
    });
  }
  // 在错误未被处理的情况下送出500的返回
  return res.send({
    status: 500,
    message: '未知的错误',
  });
});

// 配置跨域请求头
app.all("*", function (req, res, next) {
  res.header("Access-Control-Allow-Credentials", "true");
  res.header("Access-Control-Allow-Origin", "*"); //允许所有跨域请求
  res.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");
  res.header("Access-Control-Allow-Origin", req.headers.origin); // 设置允许来自哪里的跨域请求访问（值为*代表允许任何跨域请求，但是没有安全保证）
  res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS"); // 设置允许接收的请求类型
  res.header("Access-Control-Allow-Headers", "Content-Type,request-origin"); // 设置请求头中允许携带的参数
  next();
});

//导入用户路由
const userRouter = require("./router/user.js");
app.use("/user", userRouter);

//导入上传路由
const fileRouter = require("./router/file.js");
app.use("/file", fileRouter);
// const userRouter = require("./router/user.js");
// app.use("/api", userRouter);

app.listen(3004, () => {
  console.log("服务端启动成功，http://127.0.0.1:3004");
});
module.exports = app;
